﻿package igz.fleaxy.events
{
	import com.adobe.serialization.json.JSON;
	import com.adobe.serialization.json.JSONParseError;
	import flash.display.Bitmap;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import igz.fleaxy.net.CommErrorManager;
	import igz.fleaxy.net.CommMessageManager;
	import igz.fleaxy.net.CommResponseType;

	/**
	 * Clase usada por Comm para pasar una instancia como parámetro en los listeners que se añadan, ejemplo:
	 * 
	 * Comm.$Get( url, { "onComplete" : _OnComplete } );
	 * 
	 * private function _OnComplete( p_commEvent:CommEvent ) : void {
	 * 	 if ( p_commEvent.$CommResponseType == CommResponseType.$TEXT ) {
	 * 		trace(p_commEvent.$ResponseText)
	 * 	 }
	 * }
	 * 
	 * @author Intelygenz | www.intelygenz.com
	 */
	public class CommEvent extends Event {
		
		public static const COMPLETE:String = "CommEvent_OnComplete";

		private var _Params:Object;
		public function get $Params():Object {
			return _Params;
		}

		private var _ResponseXML:XML;
		public function get $ResponseXML():XML {
			return _ResponseXML;
		}

		private var _ResponseJSON:Object;
		public function get $ResponseJSON():Object {
			return _ResponseJSON;
		}

		private var _ResponseText:String;
		public function get $ResponseText():String {
			return _ResponseText;
		}

		private var _ResponseBitmap:Bitmap;
		public function get $ResponseBitmap():Bitmap {
			return _ResponseBitmap;
		}

		private var _ResponseSwf:Sprite;
		public function get $ResponseSwf():Sprite {
			return _ResponseSwf;
		}

		private var _CommResponseType:String;
		public function get $CommResponseType():String {
			return _CommResponseType;
		}

		private var _CommErrorManager:CommErrorManager;
		public function get $CommErrorManager():CommErrorManager {
			return _CommErrorManager;
		}
		
		private var _CommMessageManager : CommMessageManager;
		public function get $CommMessageManager() : CommMessageManager {
			return _CommMessageManager;
		}

		
		/**
		 * Detecta el tipo de la respuesta y la carga en el $Response correspondiente.
		 * 
		 * $CommResponseType indicará el tipo de datos devuelto, será CommResponseType.$UNKNOWN si no se reconoce ninguno.
		 * 
		 * Según el tipo de datos devuelto se cargará $ResponseSwf ó $ResponseBitmap ó $ResponseJSON, etc...
		 * 
		 * Si el tipo es JSON, además carga los errores o mensajes que pueden ser gestionados a través de $CommErrorManager o $CommMessageManager.
		 * 
		 * @param	p_commEvent Tipo de evento a crear
		 * @param	p_loader Loader o URLLoader utilizado
		 * @param	p_params Parametros que serán accesible en $Params
		 */
		public function CommEvent(p_commEvent:String, p_loader:*, p_params:Object = null) {
			super(p_commEvent);

			_Params = p_params;

			_CommResponseType = CommResponseType.$UNKNOWN;
			if ( p_loader is URLLoader ) {
				if ( (p_loader as URLLoader).dataFormat != URLLoaderDataFormat.BINARY ) {
					_ResponseText = (p_loader as URLLoader).data;

					try {
						_ResponseJSON = JSON.decode( _ResponseText );
						_CommResponseType = CommResponseType.$JSON;
					}
					catch (p_error:JSONParseError) {
						if ( _ResponseText.indexOf("<?xml") != -1 ) {
							try {
								_ResponseXML = new XML( _ResponseText );
								_CommResponseType = CommResponseType.$XML;
							}
							catch (p_error:Error) {
								trace("[CommEvent] Response Unknown: " + _ResponseText);
							}
						}
						else {
							_CommResponseType = CommResponseType.$TEXT;
						}
					}
				}
			}
			else if (p_loader is LoaderInfo) {
				if ( (p_loader as LoaderInfo).content is Bitmap ) {
					try {
						_ResponseBitmap   = (p_loader as LoaderInfo).content as Bitmap;
						_CommResponseType = CommResponseType.$BITMAP;
					}
					catch (p_err:Error) {
						throw new Error("[CommEvent] Error al intentar cargar el Bitmap");
					}
				}
				else if (  (p_loader as LoaderInfo).content is MovieClip
						|| (p_loader as LoaderInfo).content is Sprite
				) {
					if (  (p_loader as LoaderInfo).content is MovieClip ) {
						_ResponseSwf = MovieClip((p_loader as LoaderInfo).content);
					}
					else {
						_ResponseSwf = Sprite( (p_loader as LoaderInfo).content );
					}
					
					if ( _ResponseSwf == null ) {
						throw new Error("[CommEvent] No se reconoce el tipo de respuesta como un swf válido");
					}
					else {
						_CommResponseType = CommResponseType.$SWF;
					}
				}
			}

			_CommErrorManager   = new CommErrorManager();
			_CommMessageManager = new CommMessageManager();

			switch (_CommResponseType) {
				case CommResponseType.$UNKNOWN :
					//throw new Error("[CommEvent] La respuesta devolvió un formato desconocido");
					break;
				case CommResponseType.$JSON :
					_CommErrorManager.$LoadError(this);
					_CommMessageManager.$LoadMessage(this);
					break;
			}

		}

	}
	
}